<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>index03-函数</title>
</head>
<body>
  <script type="text/javascript">
      // 定义一个函数,函数声明默认会自动提升
      // fun();
      // function fun(){
      //   console.log("我是一个函数")
      // }
      // 在js中函数算一等公民，函数本身可以完成某些功能，并且可以当值传递
      // function fun(){
      //   console.log("函数是值");
      // }
      // fun();
      // var f = fun; // f和fun指向同一个函数
      // f();
      // var f = fun(); // 在js中默认函数没有添加return的话，自动会返回undefined
      // console.log(f);

      // 带参的函数
      // function fun(a, b, c) {
      //   console.log("fun1")
      //   console.log(a);
      //   console.log(b);
      //   console.log(c);
      // }
      // fun(10, 20, 30);
      // js中定义几个形参和你传几个参数是两回事
      // fun(10, 20);
      // fun(10, 20, 30, 40);
      // 在js中没有重载的概念
      // function fun(a, b) {
      //   console.log("fun2")
      //   console.log(a);
      //   console.log(b);
      // }
      // // fun(10, 20);
      // fun(10, 20, 30);
      // 在js中普通函数中即使没有形参也能拿到所有传递过来的实参
      // function fun() {
      //   console.log("获取所有参数");
      //   // 在函数内部有一个隐藏对象arguments(数组)——打包了所有传递过来的实参
      //   console.log(arguments);
      //   for (var i = 0; i <arguments.length; i++) {
      //     console.log(arguments[i]);
      //   }
      // }
      // fun(10,20,30);
      // 带有返回值的函数
      // function fun(a, b) {
      //   var c = a + b;
      //   return c;
      // }
      // var result = fun(10, 20);
      // console.log(result);

      // 函数内部不算块级作用域
      // function fun(){
      //   console.log("函数内部");
      //   var aaa = 10;
      //   console.log(aaa)
      // }
      // fun();
      // console.log(aaa);

      // 在函数内部声明变量时可以不加var，此时函数内部声明变量就转变成全局变量
      // function fun(){
      //   console.log("函数内部");
      //   bbb = 20;
      //   console.log(bbb)
      // }
      // fun();
      // console.log(bbb);
      // delete bbb;
      // console.log(bbb);

      // 在函数内部可以访问当前函数的声明的局部变量，也可以访问全局变量
      // var a = 100; // 全局变量
      // function fun(){
      //   var a = 300; // 局部变量a和全局变量a重复，这时局部变量会覆盖全局变量
      //   var b = 200;  // 局部变量
      //   console.log(a);
      //   console.log(b);
      // }
      // fun();

      // 函数内部可以返回值，函数本身可以作为值，函数可以作为另一个函数返回值
      // function fun1(){
      //   function fun2(){
      //     console.log("内部函数")
      //   }
      //   // 将fun2作为fun1函数的返回值
      //   return fun2;
      // }
      // // var f = fun1();
      // // f();
      // fun1()();

      // 匿名函数（不知道名字的函数）——函数的自执行
      // (function(){
      //   console.log("自执行函数")
      // })();
      (function(a, b, c){
        console.log("自执行函数2");
        console.log(a, b, c);
      })(10, 20, 30);
  </script>
</body>
</html>